package com.qm.console.excel;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * //                       _oo0oo_
 * //                      o8888888o
 * //                      88" . "88
 * //                      (| -_- |)
 * //                      0\  =  /0
 * //                    ___/`---'\___
 * //                  .' \\|     |// '.
 * //                 / \\|||  :  |||// \
 * //                / _||||| -:- |||||- \
 * //               |   | \\\  -  /// |   |
 * //               | \_|  ''\---/''  |_/ |
 * //               \  .-\__  '-'  ___/-. /
 * //             ___'. .'  /--.--\  `. .'___
 * //          ."" '<  `.___\_<|>_/___.' >' "".
 * //         | | :  `- \`.;`\ _ /`;.`/ - ` : | |
 * //         \  \ `_.   \_ __\ /__ _/   .-` /  /
 * //     =====`-.____`.___ \_____/___.-`___.-'=====
 * //                       `=---='
 * //
 * //
 * //     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * //
 * //               佛祖保佑         永无BUG
 * <p>
 * com.qm.console.excel
 * Created on 2020/9/22.
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ExportExcel {

    enum OffsetLimitType {
        DEFAULT("offset","limit",0),
        PAGE("pageNum", "pageSize",1),
        PAGE_LIMIT("page", "limit",1);

        private final String offset;
        private final String limit;
        private final int type;
        OffsetLimitType(String offset, String limit, int type) {
            this.offset = offset;
            this.limit = limit;
            this.type = type;
        }

        /**
         * type:0 用offset -> (offset + limit) 形式
         * type:1 用(offset-1) * limit -> offset * limit 形式
         */
        public int getType() {
            return type;
        }

        public String getLimit() {
            return limit;
        }

        public String getOffset() {
            return offset;
        }
    }

    /**
     * 某些api不支持500条一读, 需要指定limit
     */
    int pageSize() default 500;

    /**
     * page类型, 指定字段以及分页的形式
     */
    OffsetLimitType pageType() default OffsetLimitType.DEFAULT;
    /**
     * 使用该类型去解析json array中的item, 字段的mapping可以用注解写到类定义中.
     */
    Class itemCls() default DefaultClass.class;

    /**
     * 与itemNames 搭配使用，需要保证itemKeys.length == itemNames.length
     */
    String[] itemKeys() default {};

    /**
     * 与itemKeys 搭配使用，需要保证itemKeys.length == itemNames.length
     */
    String[] itemNames() default {};

    /**
     * 设置为true, 则无论是否在itemCls, itemKeys-itemNames中有定义都会导出该字段的数据.
     */
    boolean exportAll() default false;

    class DefaultClass {}

    /**
     * 导出结果的保留时间, 仅在query中没有包含endTimeKey的情况下生效
     */
    long timeOut() default 10 * 60 * 1000;

    /**
     * 导出json结果中列表的key值
     */
    String listKey() default "list";

    /**
     * query中用于指定截止时间的字段, query中没有包含该字段时，timeOut生效.
     */
    String endTimeKey() default "endTime";

//
//    /**
//     * 定义需要修改单位的字段，暂时只支持除法，用于处理货币单位的转换
//     */
//    String[] changeUnit() default {};
//
//    /**
//     * 定义货币的单位
//     */
//    int[] unit() default {};

    /**
     * 定义货币字段的转换
     */
    UnitField[] unitFields() default {};

    /**
     * 定义状态字段的转换
     */
    StateField[] stateFields() default {};

    /**
     * 定义需要展示为百分比的字段..
     */
    PercentField[] percentFields() default {};

}

